package com.demo.common.annotation;

import java.lang.annotation.*;

/**
 * 1.@Target
 * ElementType.TYPE：能修饰类、接口或枚举类型
 * ElementType.FIELD：能修饰成员变量
 * ElementType.METHOD：能修饰方法
 * ElementType.PARAMETER：能修饰参数
 * ElementType.CONSTRUCTOR：能修饰构造器
 * ElementType.LOCAL_VARIABLE：能修饰局部变量
 * ElementType.ANNOTATION_TYPE：能修饰注解
 * ElementType.PACKAGE：能修饰包
 * 例如：@Target({METHOD,TYPE})，表示他可以用在方法和类型上（类和接口），但是不能放在属性等其他位置。
 * 2.@Retention 表示生命周期
 * RetentionPolicy.SOURCE： 注解只在源代码中存在，编译成class之后，就没了。@Override 就是这种注解。
 * RetentionPolicy.CLASS： 注解在java文件编程成.class文件后，依然存在，但是运行起来后就没了。@Retention的默认值，即当没有显式指定@Retention的时候，就会是这种类型。
 * RetentionPolicy.RUNTIME： 注解在运行起来之后依然存在，程序可以通过反射获取这些信息
 * 3.@Documented //文档，用javadoc命令生成API文档，会有相关信息
 * 4.@Inherited 遗传，即注解是否可被继承
 * 5.元注解@Repeatable是JDK1.8新加入的，它表示在同一个位置重复相同的注解。在没有该注解前，一般是无法在同一个类型上使用相同的注解的。
 *
 */
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
//@Retention(RetentionPolicy.CLASS)
//@Retention(RetentionPolicy.SOURCE)
@Documented //文档，用javadoc命令生成API文档，会有相关信息
public @interface LogDemo {
    //自定义注解中有一个默认的属性value，
    //注解里面的属性可以这样写，这个地方如果不定义默认值，只写String value();在注解中就必须写一个值
    //否则就会报错，要是想要可以不写也不会报错，就必须要定义默认值
    String value() default "";
}
